home *** CD-ROM | disk | FTP | other *** search
/ Software Vault: The Diamond Collection / The Diamond Collection (Software Vault)(Digital Impact).ISO / cdr44 / 2m30src.zip / 2MBOOTHD.INC < prev    next >
Text File  |  1995-03-06  |  6KB  |  137 lines

  1.  
  2. ;┌───────────────────────────────────────────────────────────────────┐
  3. ;│                                                                   │
  4. ;│      2MBOOTHD 3.0  -  (C) 1994-1995  Ciriaco García de Celis.     │
  5. ;│                                                                   │
  6. ;│        Con código del sector de arranque para discos HD/ED.       │
  7. ;│                                                                   │
  8. ;└───────────────────────────────────────────────────────────────────┘
  9.  
  10.                CLI
  11.                XOR   AX,AX
  12.                MOV   SS,AX
  13.                MOV   SP,7C00h          ; SS:SP inicializado
  14.                MOV   AX,07C0h
  15.                PUSH  AX
  16.                ADD   AX,20h
  17.                PUSH  AX
  18.                POP   ES
  19.                POP   DS
  20.                XOR   SI,SI
  21.                XOR   DI,DI
  22.                MOV   CX,100h
  23.                CLD
  24.                REP   MOVSW             ; auto-reubicar este código
  25.                MOV   BX,DS:[68]        ; constante de reubicación
  26.                LEA   AX,[BX+OFFSET boot_ini - OFFSET _BootHDPrg]
  27.                PUSH  ES
  28.                PUSH  AX
  29.                RETF                    ; saltar a boot_ini reubicado
  30.  
  31. boot_ini:      STI
  32.                MOV   SI,OFFSET boot_txt - OFFSET _BootHDPrg
  33.                CALL  outmsg
  34.                MOV   BX,1Eh*4
  35.                LDS   SI,DWORD PTR SS:[BX]
  36.                PUSH  DS                ; *
  37.                PUSH  SI                ; **
  38.                XOR   DI,DI
  39.                MOV   SS:[BX],DI
  40.                MOV   SS:[BX+2],ES
  41.                MOV   CX,11
  42.                REP   MOVSB             ; copiar tabla base disco a RAM
  43.                PUSH  ES
  44.                POP   DS
  45.                MOV   AL,DS:[24]
  46.                MOV   [DI-7],AL         ; sectores/pista correctos
  47.                XOR   AX,AX
  48.                MOV   ES,AX
  49.                MOV   BX,7C00h          ; ES:BX = 0000:7C00
  50.                MOV   ES:[BX+1FEh],AX   ; boot aún no válido
  51.                MOV   AX,0201h          ; leer un sector
  52.                MOV   CX,DS:[22]
  53.                ADD   CX,2              ; el primer sector de la FAT2
  54.                XOR   DX,DX             ; cabezal 0 y unidad A:
  55.                PUSH  CX
  56.                INT   13h               ; cargar sector real de boot
  57.                POP   CX
  58.                MOV   BX,SS:[413h]
  59.                SUB   BX,5
  60.                MOV   AX,64
  61.                MUL   BX
  62.                MOV   ES,AX
  63.                PUSH  BX                ; ***
  64.                XOR   BX,BX
  65.                MOV   AX,205h           ; leer 5 sectores
  66.                INC   CX                ; cilindro 0 y 2º sector FAT2
  67.                XOR   DX,DX             ; cabezal 0 y unidad A:
  68.                INT   13h
  69.                POP   BX                ; ***
  70.                POP   SS:[1Eh*4]        ; **  restaurar INT 1Eh
  71.                POP   SS:[1Eh*4+2]      ; *
  72.                CMP   WORD PTR ES:[2558],0AA55h  ; ¿código válido?
  73.                JNE   boot2             ; SuperBOOT probablemente ya cargado
  74.                MOV   SS:[413h],BX      ; rebajar memoria libre
  75.                PUSH  ES                ; *
  76.                MOV   AH,8
  77.                MOV   BL,0
  78.                MOV   DL,0
  79.                INT   13h               ; ¿tipo de unidad A:?
  80.                MOV   AL,BL
  81.                MOV   AH,0
  82.                CMP   DL,2
  83.                JB    ins_sb
  84.                PUSH  AX
  85. award_pelma:   MOV   AH,8
  86.                MOV   BL,0
  87.                MOV   DL,1              ; ¿tipo de unidad B:?
  88.                INT   13h
  89.                CMP   AH,6              ; la BIOS Award devuelve error
  90.                JE    award_pelma       ; 6 incluso en esta función
  91.                POP   AX                
  92.                MOV   AH,BL
  93. ins_sb:        POP   ES                ; *
  94.                MOV   ES:[2558],ES           ; segmento del CALL FAR
  95.                CALL  DWORD PTR ES:[2556]    ; instalar SuperBOOT
  96. boot2:         MOV   AX,201h           ; leer un sector
  97.                XOR   DX,DX             ; cabezal 0 y unidad A:
  98.                MOV   ES,DX
  99.                MOV   CX,1              ; el sector 1 del cilindro 0
  100.                MOV   BX,8000h          ; acceso de lectura sólo para
  101.                PUSH  AX                ; quitar error "disco cambiado"
  102.                INT   13h
  103.                POP   AX
  104.                MOV   BX,7C00h
  105.                PUSH  ES                ; apilar dirección 0:7C00h
  106.                PUSH  BX
  107.                CMP   WORD PTR ES:[BX+3],"M2"
  108.                JNE   exec_boot         ; el BOOT virtual no es 2M
  109. hd_boot:       MOV   DL,80h            ; primer disco duro
  110.                INT   13h               ; cargar tabla de particiones
  111. exec_boot:     CMP   WORD PTR ES:[7DFEh],0AA55h
  112.                JNE   intenta_hd?
  113.                XOR   DX,DX             ; conviene DX=0 para Microsoft
  114.                RETF                    ; ejecutar partición / BOOT
  115. intenta_hd?:   AND   DL,DL
  116.                JZ    hd_boot           ; BOOT no válido, probar HD
  117.  
  118.                MOV   SI,OFFSET no_boot_txt - OFFSET _BootHDPrg
  119.                CALL  outmsg
  120.                MOV   AH,0
  121.                INT   16h               ; esperar tecla
  122.                INT   19h               ; volver a arrancar
  123.  
  124. outmsg:        ADD   SI,DS:[68]
  125. putchar:       CLD
  126.                LODSB
  127.                AND   AL,AL
  128.                JZ    retorno
  129.                MOV   AH,0Eh
  130.                MOV   BX,7
  131.                INT   10h               ; imprimir carácter
  132.                JMP   putchar
  133. retorno:       RET
  134.  
  135. boot_txt       DB    13,10,"2M SuperBOOT 3.0",13,10,0
  136. no_boot_txt    DB    13,10,"¡No botable!",13,10,0
  137.